/**
 * Posicion.h
 *
 *  Created on: 27/12/2009
 *      Author: San Martín, Matías I.
 */

#ifndef POSICION_H_
#define POSICION_H_

#include <utility>
#include <sstream>

#include "../../Aplicacion/Common/CommonTypes.h"

#include "../../Framework/IO/SerializableToCharArray.h"

// si se cambia este tipo tener en cuenta cambiar el tipo de los parámetros
// posx y posy del método RPC suscribir_planeta en DirectorioRPC.x
typedef float t_coordenada;
typedef std::pair<t_coordenada,t_coordenada> t_coordenadas;

class Posicion : public framework::io::SerializableToCharArray {
//------------------------------ CONSTANTES ------------------------------
public:

//------------------------------ ATRIBUTOS ------------------------------
private:
	t_coordenadas _coordenadas;

//------------------------------ METODOS ------------------------------
public:

	//asigna la posición 0,0
	Posicion();

	Posicion(t_coordenada x, t_coordenada y);

	virtual ~Posicion();

	std::string toString() const
	{
		std::stringstream stm;
		stm << *this;
		return stm.str();
	}

	void setXY(t_coordenada x, t_coordenada y);

	t_coordenada getX() const;
	t_coordenada getY() const;

	/**
	 * Permite obtener la distancia al otro planeta
	 */
	T_DISTANCIA getDistancia(const Posicion& otro) const;

	/**
	 * Normaliza el vector posicion para que tenga modulo 1
	 */
	void normalizar();

	double getModulo() const;

	/**
	 * devuelve el vector direccion al destino modificado por el multiplicador
	 */
	Posicion getDireccion(const Posicion& destino, double multiplicador = 1.0) const;

	bool operator == (const Posicion& otro) const;

	Posicion& operator += (const Posicion& sumar);

	Posicion operator - (const Posicion& restar) const;
	Posicion operator + (const Posicion& sumar) const;
	Posicion operator / (double divisor) const;
	Posicion operator * (double factor) const;

	//-------------------- de interfaz framework::io::SerializableToFile
	/**
	 * @see framework::io::SerializableToFile#save(int)
	 */
	virtual size_t save (int fd) const;

	/**
	 * @see framework::io::SerializableToFile#load(int)
	 */
	virtual size_t load (int fd);

	/**
	 * @see middleware::io::SerializableToArray#saveToArray(int)
	 */
	virtual size_t saveToArray (uint8_t* arr) const;

	/**
	 * @see middleware::io::SerializableToArray#loadFromArray(int)
	 */
	virtual size_t loadFromArray (const uint8_t* arr);


private:
	friend std::ostream &operator<<( std::ostream &stream, const Posicion &obj );
};

#endif /* POSICION_H_ */
